"""
本文件主要用来收纳关于Python的数据容器的相关的代码
"""

'''
Python 基础入门语法 数据容器
01 list
'''


def learn_list():
    # 列表的定义
    empty_list1 = []
    empty_list2 = list()
    print(empty_list1)
    print(empty_list2)

    name_list = ['itheima', 'itcast', 'python']
    print(name_list)
    print(type(name_list))

    my_list = ['itheima', 666, True, name_list]
    print(my_list)
    print(type(my_list))

    # 正向索引
    print(name_list[0])
    # 负向索引 (my_list的最后一个元素是name_list，它也是一个列表)
    print(my_list[-1])

    # 嵌套列表
    matrix = [[1, 2, 3],
              [4, 5, 6],
              [7, 8, 9]]
    print(matrix[0][0])
    print(matrix[2][2])

    # 列表的常用操作
    print('————————————————————————————————————————下面是关于列表的常用方法的案例————————————————————————————————————————')
    mylist = ['itheima', 'itcast', 'python']
    # 1.查找某元素的下标索引
    print(mylist.index('python'))
    # 2.若查找的元素不存在于列表中，则程序会报错-ValueError
    # my_list.index('luoqianshi')
    # 3.修改指定下标位置的元素的值
    mylist[0] = 'luoqianshi'
    print(mylist)
    # 4.在指定的下标位置插入元素
    mylist.insert(0, '深度学习')
    print(mylist)
    # 5.将指定的【单个元素】追加到列表的尾部
    mylist.append('我是新加到列表最末尾的元素')
    print(mylist)
    # 6.将指定的【一批元素】追加到列表的尾部
    # mylist.append(['我是新加到列表最末尾的元素1',
    #                '我是新加到列表最末尾的元素2',
    #                '我是新加到列表最末尾的元素3'])
    # 使用extend才是正确的方法！
    extended_list = ['我是新加到列表最末尾的元素1',
                     '我是新加到列表最末尾的元素2',
                     '我是新加到列表最末尾的元素3']
    mylist.extend(extended_list)
    print(mylist)
    # 7.删除指定下标的元素
    # 方法一 del+列表[下标]
    del mylist[0]
    print(mylist)
    # 方法二,列表.pop(下标) 可以把删掉的元素作为返回值返回
    element = mylist.pop(0)
    print(mylist, '\n删除的元素是：', element)
    # 8.指定内容删除某元素在列表中的【第一个匹配项】
    print(mylist)
    mylist.remove('python')
    print(mylist)
    # 9.清空列表
    mylist.clear()
    print(mylist)
    # 10.统计某一个元素在列表内的数量
    print(mylist.count('python'))

    # 列表的遍历
    print('————————————————————————————————————————下面是关于列表的遍历的案例————————————————————————————————————————')
    # 1.列表的while循环遍历
    lqs_list = ['1', '2', '3', '4', '5', '6']
    index = 0
    while index < len(lqs_list):
        print(lqs_list[index])
        index += 1
    # 2.列表的for循环遍历
    for item in lqs_list:
        print(item)


'''
Python 基础入门语法 数据容器
02 tuple
'''

def learn_tuple():
    # 元组的定义
    empty_tuple1 = ()
    empty_tuple2 = tuple()
    print(empty_tuple1)
    print(empty_tuple2)

    mytuple = ('xmu', 'luoqianshi', 1, True)
    print(mytuple)
    print(type(mytuple))

    # 特例：定义只有单个元素的元组：必须要在第一个元素后加一个逗号！
    t1 = ('xmu')
    t2 = ('luoqianshi', )
    print(t1, f't1的types是{type(t1)}')
    print(t2, f't2的types是{type(t2)}')

    # 嵌套元组
    multi_tuple = ((1, 2, 3), (4, 5, 6))
    print(multi_tuple[0][0])

    # 元组的相关操作：index查找某个值在元组中的下标的方法
    tuple_function1 = ('xmu', 'luoqianshi', '自动化系')
    index = tuple_function1.index('xmu')
    print(f'xmu在tuple_function1中的下标值为{index}')

    # 元组的相关操作：count统计某个值在元组中的数量的方法
    tuple_function2 = ('xmu', 'luoqianshi', '自动化系',
                       'xmu', 'luoqianshi', '自动化系',
                       'xmu', 'luoqianshi', '自动化系')
    numb = tuple_function2.count('xmu')
    print(f'xmu在tuple_function2中的出现次数为{numb}')

    # 元组的相关操作：len计算元组中所有元素的总个数的方法
    tuple_function3 = ('xmu', 'luoqianshi', '自动化系',
                       'xmu', 'luoqianshi', '自动化系',
                       'xmu', 'luoqianshi', '自动化系')
    length = len(tuple_function3)
    print(f'tuple_function3的总元素个数为{length}')

    # 元组的遍历：while
    tuple_loop = ('xmu', 'luoqianshi', '自动化系', True, 'Python')
    index = 0
    while index < len(tuple_loop):
        print(tuple_loop[index])
        index += 1

    # 元组的遍历：for
    for item in tuple_loop:
        print(item)

    # 尝试修改元组中的元素
    tuple_assignment = ('xmu', 'python', ['lkh'])
    # tuple_assignment[0] = 'jmu'

    # 如果元组中的元素是可编辑的其它数据容器，则不会报错
    print(f'这是修改前的{tuple_assignment}')
    tuple_assignment[2][0] = 'lqs'
    print(f'这是修改后的{tuple_assignment}')
    pass


'''
Python 基础入门语法 数据容器
03 str
'''
def learn_str():
    my_string = '      jmu_luoqianshi_python'
    # 通过下标索引取值
    print(my_string[0])
    print(my_string[-10:])

    # index方法：按值查找下标
    print(my_string.index('n'))

    # replace方法：子串替换
    replaced_string = my_string.replace('jmu', 'xmu')
    print(f'replace方法并不会修改原本的字符串变量：{my_string}')
    print(f'replace方法会返回一个新的替换后的字符串变量：{replaced_string}')

    # split方法：字符串分割
    substrings = my_string.split('_')
    print(f'完成了对my_string的字符串分割后依次得到：')
    for substring in substrings:
        print(substring)

    # strip方法：字符串规整化
    # 如果不传参则清空【字符串前后】的所有空格字符
    print(f'这是strip之前的字符串{my_string}')
    new_string = my_string.strip()
    print(f'这是strip之后的字符串{new_string}')
    # 如果传参则清空【字符串前后】的【指定】字符
    special_string = '1212 luokunhong 2112'
    print(f'这是strip之前的字符串{special_string}')
    striped_string = special_string.strip('12')
    print(f'这是strip之后的字符串{striped_string}')

    # count方法：统计字符串中某字符串的出现次数
    numb = new_string.count('_')
    print(f'在字符串中， _ 出现的次数为{numb}次。')

    # len：统计字符串的长度
    length = len(new_string)
    print(f'new_string的字符串长度为{length}')
    pass


'''
Python 基础入门语法 数据容器
04 slice-切片操作
'''
def learn_slice():
    # 对list进行切片，从1开始，4结束，步长为1
    my_list = [0, 1, 2, 3, 4, 5, 6]
    print(my_list[1:4:1])

    # 对tuple进行切片，从头开始，到最后结束，步长1
    my_tuple = (0, 1, 2, 3, 4, 5, 6)
    print(my_tuple[::1])

    # 对str进行切片，从头开始，到最后结束，步长2
    string = 'hello world'
    print(string[::2])

    # 对str进行切片，从头开始，到最后结束，步长-1
    string = 'hello world'
    print(string[::-1])
    print(string[4:2:-1])

    # 对list进行切片，从3开始，到1结束，步长-1
    my_list = [0, 1, 2, 3, 4, 5, 6]
    print(my_list[3:1:-1])

    # 对tuple进行切片，从头开始，到最后结束，步长-2
    my_tuple = (0, 1, 2, 3, 4, 5, 6)
    print(my_tuple[::-2])
    pass


if __name__ == '__main__':
    # 01 learn_list
    # learn_list()
    # 02 learn_tuple
    # learn_tuple()
    # 03 learn_str
    # learn_str()
    # 04 learn_slice
    # learn_slice()
    pass
